# -*- coding: utf-8 -*-
"""
Created on Sun Feb  3 17:01:56 2019
windows7
python3.6.3
Anaconda3->spyder
opencv3.4.5
代码参考《OpenCV3计算机视觉 Python语言实现》（第二版）
@author: Administrator
"""

import cv2
#import numpy as np
#from scipy import ndimage

print(cv2.__version__)                    # 查看opencv的版本

"""blurKsize,edgeKsize两个都必须是奇数，并且edgeKsize不能大于31"""
#src是输入的图像
#dst是最后处理得到的目标图像
def strokEdges(src,dst,blurKsize = 7,edgeKsize = 5):
    if blurKsize >= 3:
        '''cv2.medianBlur(src,blurKsize)中blurKsize是滤波核大小，必须是大于1的奇数'''
        blurredSrc = cv2.medianBlur(src,blurKsize)               # cv2.medianBlur是中值滤波模糊函数，对去除数字化视频噪音很有效
        graySrc = cv2.cvtColor(blurredSrc,cv2.COLOR_BGR2GRAY)
    else:
        graySrc = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    '''
    cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
    cv2.Laplacian处理的图像必须是灰度图
    第二个参数是深度，-1表示采用与原图像同样的深度处理图像
    第三个参数是dst，处理后的图像存放
    第四个是核的大小    
    delta是一个可选的增量，将会加到最终的dst中，同样，默认情况下没有额外的值加到dst中；
    borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
    '''
    cv2.Laplacian(graySrc,cv2.CV_8U,graySrc,ksize = edgeKsize)
    normalizedInverseAlpha = (1.0/255) * (255-graySrc) #归一化因子--->透明度
    '''
    通道拆分
    (B, G, R) = cv2.split(image)
     # 显示各个分离出的通道
    cv2.imshow("Red", R)
    cv2.imshow("Green", G)
    cv2.imshow("Blue", B)
    cv2.waitKey(0)
    '''
    channels = cv2.split(src)
    for channel in channels:
        #print(channel.shape,'channel')
        '''
        channel与normalizedInverseAlpha形状尺寸大小相同，并且都是数组类型，因此可以相乘，
        并且这不是列表那种重复乘法，
        这里是对应位置的数据相乘。
        '''
        channel[:] = channel * normalizedInverseAlpha
        #print(channel,'channel',normalizedInverseAlpha.shape)
    '''
    通道合并，例如
    # 生成一个值为0的单通道数组 
    zeros = np.zeros(image.shape[:2], dtype = "uint8") #[0:2]是指取列表里0和1的内容，不包含2的内容，相当半闭区间
    # 分别扩展B、G、R成为三通道。另外两个通道用上面的值为0的数组填充 
    cv2.imshow("Blue", cv2.merge([B, zeros, zeros])) 
    cv2.imshow("Green", cv2.merge([zeros, G, zeros])) 
    cv2.imshow("Red", cv2.merge([zeros, zeros, R])) 
    cv2.waitKey(0)
    '''
    cv2.merge(channels,dst) #这里将[B,G,R]三通道合并在一起，并输出到目标文件
    
img = cv2.imread('pycv.png')
img2 = img.copy()
img3 = img.copy()
strokEdges(img2,img3) # 将图片进行模糊处理
img4 = img - img3     # 提取出边缘
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.waitKey()
cv2.destroyAllWindows()